package com.situ.company.web220111.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FmtUpload {

    public final static String FILE_NAMES = "filenames";

    /**
     * 实现服务器端保存上传多张图片的功能
     * @param request
     * @return Map key=非文件域参数名 value=非文件域参数值（key=filenames，value=上传保存图片文件名集合）
     * @throws FileUploadException
     * @throws IOException
     */
    public static Map<String, Object> upload(HttpServletRequest request) throws FileUploadException, IOException {// 上传代码，上传功能

	DiskFileItemFactory factory = new DiskFileItemFactory();
	ServletFileUpload   upload  = new ServletFileUpload(factory);
	// 解析请求传过来的对象 upload.parseRequest(request) 需要异常处理
	// 返回来的是集合，类型是FileItem
	List<FileItem>	    items   = upload.parseRequest(request);  // 异常处理
	Map<String, Object> result  = new HashMap<>();
	List<String>	    names   = new ArrayList<>();
//	int	i = 1;			     // 让key不重复
	for (FileItem item : items) {
	    if (item.isFormField()) {// 判断是否是非文件域--就不保存文件
		String name  = item.getFieldName();
//		System.out.println("name" + "=" + name);
		String value = item.getString();
		value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
		result.put(name, value);
//		System.out.println("value" + "=" + value);
	    } else {// 是文件域表单元素--保存文件
//		System.out.println(item.getFieldName() + "  " + item.getName());
		// 把网页这端传过来的图片字节流保存在文件中，把java这端接收到的流以字节流的形式从Java
		// 这端输出出去变成文件 FileOutputStream把Java接收到的图片字节流，从java里
		// 面写出去变成文件
		String		 fn	= getFName(item);			      // 调用方法获取唯一文件
		FileOutputStream fos	= new FileOutputStream(getFPath() + "/" + fn);// 路径
		InputStream	 is	= item.getInputStream();
		int		 length	= -1;
		byte[]		 b	= new byte[1024 * 1024];
		while (-1 != (length = is.read(b))) {
		    fos.write(b, 0, length);
		}
		fos.flush();
		fos.close();
		is.close();
		names.add(fn);
//		request.setAttribute("key" + (i++), fn);// 往域里面存
	    }
	}
	result.put(FILE_NAMES, names);
	return result;
    }

    private static File getFPath() {// 获得保存文件的文件夹目录
	File f = new File("/Users/fengdefangxiang/IdeaProjects/web220111/src/main/webapp/web/base/img");
	if (f.exists()) {
	    f.mkdir();
	}
	return f;// 将文件夹目录返回
    }

    private static String getFName(FileItem item) {// 获得唯一文件名+后缀名
	String fn   = item.getName();		   // 获得文件的名字(包括文件扩展名)
	String uuid = UUID.randomUUID().toString();// 生成唯一序列
	fn = uuid + fn.substring(fn.indexOf("."));// 唯一序列拼接+扩展名
	return fn;
    }
    public static void delFile(String filename) {
	File f = new File(getFPath() + "/" + filename);
	f.delete();
    }

}
